﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Altairis.FluffyCloud.Data {

    public class User {

        #region Fields required by TableMembershipProvider

        [Display(AutoGenerateField = false), Key, Required, MaxLength(100, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        public string UserName { get; set; }

        [Display(AutoGenerateField = false), Required, MaxLength(64), MinLength(64)]
        public byte[] PasswordHash { get; set; }

        [Display(AutoGenerateField = false), Required, MaxLength(128), MinLength(64)]
        public byte[] PasswordSalt { get; set; }

        [Display(AutoGenerateField = false), Required, MaxLength(100, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        public string Email { get; set; }

        [Display(AutoGenerateField = false), Required]
        public bool IsApproved { get; set; }

        [Display(AutoGenerateField = false), Required]
        public DateTimeOffset DateCreated { get; set; }

        [Display(AutoGenerateField = false)]
        public DateTimeOffset? DateLastLogin { get; set; }

        [Display(AutoGenerateField = false)]
        public DateTimeOffset? DateLastActivity { get; set; }

        [Display(AutoGenerateField = false)]
        public DateTimeOffset DateLastPasswordChange { get; set; }

        [Display(AutoGenerateField = false)]
        public virtual ICollection<Role> Roles { get; set; }

        #endregion

        // System data and settings

        [Required, MaxLength(43), ScaffoldColumn(false)]
        public string SecurityCode { get; set; }

        [ScaffoldColumn(false)]
        public bool SendNewMessagesToEmail { get; set; }

        [ScaffoldColumn(false), MaxLength(39)]
        public string RegistrationIpAddress { get; set; }

        [ScaffoldColumn(false), MaxLength(39)]
        public string LastLoginIpAddress { get; set; }

        [ScaffoldColumn(false), MaxLength(100)]
        public string ThemeCssUrl { get; set; }

        // Character info

        [Display(Name = "Krátký komentář", GroupName = "Postava", Description = "Komentář se zobrazí (téměř) všude vedle vašeho uživatelského jména, například ve výpisu zpráv."), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        public string Comment { get; set; }

        [Display(Name = "Živočišný druh", GroupName = "Postava", Description = "Živočišný druh vaší furry postavy."), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        public string Species { get; set; }

        [Display(Name = "Popis postavy", GroupName = "Postava", Description = "Zde můžete zadat obšírnější popis postavy, co jste zač."), DataType("WikiMarkup")]
        public string Description { get; set; }

        // User info

        [Display(Name = "Jméno a příjmení", GroupName = "Uživatel", Description = "Vaše skutečné jméno a příjmení."), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        public string FullName { get; set; }

        [Display(Name = "Datum narození", GroupName = "Uživatel", Description = "Datum narození není povinné, ale bez jeho uvedení bude uživatel pokládán za nezletilého a budou mu znepřístupněny některé služby. Datum narození se nezobrazuje, ve vašem profilu se zobrazuje pouze vypočtený věk. Udávejte ve formátu rrrr-mm-dd."), DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime? BirthDate { get; set; }

        [Display(Name = "Město", GroupName = "Uživatel", Description = "Město, ve kterém se nejčastěji nacházíte."), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        public string City { get; set; }

        [ScaffoldColumn(false)]
        public int? Age {
            get {
                if (!this.BirthDate.HasValue) return null;
                var now = DateTime.Today;
                var age = now.Year - this.BirthDate.Value.Year;
                if (this.BirthDate.Value > now.AddYears(-age)) age--;
                return age;
            }
        }

        // Contacts

        [Display(Name = "Osobní stránka", GroupName = "Kontakty", Description = "Zadejte včetně 'http://'."), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        [RegularExpression(@"^http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?$", ErrorMessage = "Chybný formát adresy osobní stránky")]
        public string HomePage { get; set; }

        [Display(Name = "Telefonní číslo", GroupName = "Kontakty", Description = "Zadejte v mezinárodním formátu, bez mezer - např. '+420123456789'."), MaxLength(20), DataType(DataType.PhoneNumber)]
        [RegularExpression(@"^\+42[01][0-9]{9}", ErrorMessage = "Chybný formát telefonního čísla")]
        public string PhoneNumber { get; set; }

        [Display(Name = "ICQ UIN", GroupName = "Kontakty"), MaxLength(15, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        [RegularExpression("^[0-9]{5,}$", ErrorMessage = "Chybný formát ICQ UIN")]
        public string Icq { get; set; }

        [Display(Name = "MSN/Live Messenger", GroupName = "Kontakty"), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        [RegularExpression(@"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$", ErrorMessage = "Chybný formát adresy MSN/Live messengeru")]
        public string MsnMesseger { get; set; }

        [Display(Name = "Jabber", GroupName = "Kontakty"), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků"), DataType(DataType.EmailAddress)]
        [RegularExpression(@"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$", ErrorMessage = "Chybný formát Jabber ID")]
        public string Jabber { get; set; }

        [Display(Name = "Twitter", GroupName = "Kontakty", Description = "Váš Twitter handle, včetně zavináče na začátku."), MaxLength(16)]
        [RegularExpression("^@[a-zA-Z0-9_]{1,15}$", ErrorMessage = "Chybný formát Twitter handle")]
        public string Twitter { get; set; }

        [Display(Name = "Facebook", GroupName = "Kontakty", Description = "Vaše uživatelské jméno na Facebooku."), MaxLength(30, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        [RegularExpression("^[a-zA-Z0-9_.]{3,30}$", ErrorMessage = "Chybný formát Facebook ID")]
        public string Facebook { get; set; }

        [Display(Name = "IRC FurNet", GroupName = "Kontakty", Description = "Nick, pod kterým se obvykle vyskytujete na IRC."), MaxLength(30, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        public string FurNet { get; set; }

        [Display(Name = "Skype", GroupName = "Kontakty", Description = "Vaše uživatelské jméno na Skype"), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        public string Skype { get; set; }

        [Display(Name = "FurAffinity", GroupName = "Kontakty", Description = "Vaše uživatelské jméno na FurAffinity"), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        [RegularExpression("^[a-zA-Z0-9_-~]{3,}$", ErrorMessage = "Uživatelské jméno na FA obsahuje nepovolené znaky")]
        public string FurAffinity { get; set; }

        [Display(Name = "DeviantArt", GroupName = "Kontakty", Description = "Vaše uživatelské jméno na DeviantArtu"), MaxLength(50, ErrorMessage = "{0} smí mít nejvýše {1} znaků")]
        [RegularExpression("^[a-zA-Z0-9-]{3,}$", ErrorMessage = "Uživatelské jméno na DA obsahuje nepovolené znaky")]
        public string DeviantArt { get; set; }

        // Navigation properties

        public virtual ICollection<UserAclEntry> AccessList { get; set; }

        public virtual ICollection<Message> MessagesSent { get; set; }

        public virtual ICollection<Message> MessagesReceived { get; set; }

        [ScaffoldColumn(false)]
        public virtual ICollection<TopicUserState> TopicStates { get; set; }

    }

}
